package infb.dao;

import infb.modelo.Medicos;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;


@Stateless(mappedName="MedicosEJB")
public class MedicosBean implements MedicosInterfaz{
    @PersistenceContext
    private EntityManager em;

    public void create(Medicos medicos) {
        em.persist(medicos);
    }

    public void edit(Medicos medicos) {
        em.merge(medicos);
    }

    public void remove(Medicos medicos) {
        em.remove(em.merge(medicos));
    }

    public Medicos find(Object id) {
        return em.find(Medicos.class, id);
    }

    public List<Medicos> findAll() {
        return em.createQuery("select m from Medicos m order by m.apellido1,m.apellido2,m.nombre asc").getResultList();
    }

    /*
     * Metodo para comprobar si un medico esta correctamente registrado en el sistema
     * Utilizado por el mecanismo de autenticacion
     */
    public Medicos estaAutenticado(String numColegiado, String password) {
         List resultados = em.createQuery("SELECT m FROM Medicos m where m.numColegiado=?1 and m.password=?2")
        .setParameter(1, numColegiado)
        .setParameter(2, password)
        .getResultList();

        return (Medicos) (resultados.isEmpty() ? null : resultados.get(0));
    }

    /*
     * Metodo asociado al formulario de busqueda de medicos
     */
    public List busquedaAvanzada(String dni, String numColegiado, String apellido1, String apellido2, String nombre, String especialidad) {
        dni=dni.toUpperCase();
        numColegiado=numColegiado.toUpperCase();
        apellido1=apellido1.toUpperCase();
        apellido2=apellido2.toUpperCase();
        nombre=nombre.toUpperCase();

        boolean hayWhere=false;
        String sql="select m from Medicos m ";
        if(!dni.equals("")){
            sql+=!hayWhere?"where upper(m.dni) like ?1 ":"and upper(m.dni) like ?1 ";
            hayWhere=true;
        }
        if(!numColegiado.equals("")){
            sql+=!hayWhere?"where upper(m.numColegiado) like ?2 ":"and upper(m.numColegiado) like ?2 ";
            hayWhere=true;
        }
        if(!apellido1.equals("")){
            sql+=!hayWhere?"where upper(m.apellido1) like ?3 ":"and upper(m.apellido1) like ?3 ";
            hayWhere=true;
        }
        if(!apellido2.equals("")){
            sql+=!hayWhere?"where upper(m.apellido2) like ?4 ":"and upper(m.apellido2) like ?4 ";
            hayWhere=true;
        }
        if(!nombre.equals("")){
            sql+=!hayWhere?"where upper(m.nombre) like ?5 ":"and upper(m.nombre) like ?5 ";
            hayWhere=true;
        }
        if(!especialidad.equals("")){
            sql+=!hayWhere?"where m.especialidad.especialidad=?6 ":"and m.especialidad.especialidad=?6 ";
            hayWhere=true;
        }
        sql+="order by m.apellido1,m.apellido2,m.nombre asc";
        Query consulta=em.createQuery(sql);
        if(!dni.equals("")){
            consulta.setParameter(1, dni+"%");
        }
        if(!numColegiado.equals("")){
            consulta.setParameter(2, numColegiado+"%");
        }
        if(!apellido1.equals("")){
            consulta.setParameter(3, apellido1+"%");
        }
        if(!apellido2.equals("")){
            consulta.setParameter(4, apellido2+"%");
        }
        if(!nombre.equals("")){
            consulta.setParameter(5, nombre+"%");
        }
        if(!especialidad.equals("")){
            consulta.setParameter(6, especialidad);
        }

        return consulta.getResultList();
        
    }
}
